查看原文
其他

基于 Prometheus 进行容器监控的5个常见难点解读

twt社区 twt企业IT社区 2024-02-18

当我们使用Kubernetes进行容器化管理时,传统监控工具无法对Kubernetes做到统一有效的全面监控,全面监控Kubernetes也就成为我们需要探索的问题。以下是几个容器环境下基于Prometheus 进行监控的难点解读,由社区同行分享,供大家参考。


1、在Kubernetes集群内实现部署Prometheus的方案是什么,这种方案有什么优势?

@晓风 光大科技 研发工程师:

1、我们的方案是使用Prometheus Operator以及helm工具在Kubernetes集群上部署Prometheus服务,Prometheus Operator允许用户能够使用简单的声明性配置来配置和管理Prometheus实例,这些配置将响应、创建、配置和管理Prometheus监控实例。

使用Operator部署了Prometheus之后就可以不用再管Prometheus Server了,以后如果要添加监控对象或者添加告警规则,只需要编写对应的ServiceMonitor和Prometheus资源就可以,不用再重启Prometheus服务,Operator会动态的观察配置的改动,并将其生成为对应的Prometheus配置文件其中Operator可以部署、管理Prometheus Service。

2、方案优势,在Prometheus Operator中,它会创建Prometheus、ServiceMonitor、AlertManager以及PrometheusRule 4个CRD资源对象。这些API对象全都是用CRD定义好Schema的,api-server会帮我们做校验,这就大大降低了配置异常的风险。ServiceMonitor和PrometheusRule这两个对象解决了Prometheus配置难维护的问题。

其次,Prometheus Operator借助Kubernetes把Prometheus服务平台化了,实现Prometheus as a Service。在有了Prometheus和Alertmanager这样非常明确的API对象之后,用户就能够以Kubernetes 平台为底座,自助式地创建Prometheus服务或Alertmanager 服务。这些新的API对象基于Operator模式,具有基于Kubernetes进行扩展的优势。

@mtming333  甜橙金融翼支付 系统运维工程师:

容器平台Prometheus分指标联邦架构方案:

1、单个生产机房按采集指标划分K8S调度部署多个prome 1、prome 2

2、用K8S保证基层prome的可用性

3、汇聚数据至上层联邦prome A与prome B,两个联邦节点独立写库,两套持久数据库单点部署,分别保留独立数据,以保证数据多副本

4、告警数据从2个联邦层prome获取,经过gossip筛选产生告警

5、Kibana经过负载均衡获取联邦prome数据出图


2、容器环境监控中如何预估每天Prometheus数据库存储量的增长?

@晓风 光大科技 研发工程师:

在一般情况下,Prometheus中存储的每一个样本大概占用1-2字节大小。预估Prometheus Server的本地磁盘空间大小,使用以下公式计算:

磁盘大小 = 保留时间 * 每秒获取样本数 * 样本大小

(每秒获取样本数可由抓取间隔内采集的样本总数除以抓取间隔获取)

@mtming333 甜橙金融翼支付 系统运维工程师:,

社区文档,借花献佛:


3、目前Prometheus能否支持对网络设备的监控,如何支持采用snmp ssh 等协议方式的监控?

@晓风 光大科技 研发工程师: 

Prometheus有snmp的exporter可以实现网络监控。Prometheus通过snmp_exporter抓取网络设备流量数据。 

用Prometheus监控网络设备流量首先需要确定安装prometheus 的机器已经被网络设备允许获取它的数据。


4、Prometheus监控k8s如何自动发现服务?

@晓风  光大科技 研发工程师:

在Kubernetes下Prometheus需要与Kubernetes的API进行交互,从而能够动态的发现Kubernetes中部署的所有可监控的目标资源。 

目前主要支持5种服务发现模式,分别是:Node、Service、Pod、Endpoints、Ingress。 

为了让Prometheus能够获取到当前集群中所有节点的信息, 我们在Prometheus配置文件中 ,添加如下Job配置:

- job_name: 'kubernetes-nodes' tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token # 这里需要指定用于访问Kubernetes API的ca以及token文件路径 kubernetes_sd_configs: - role: node # 通过指定kubernetes_sd_config的模式为node,Prometheus会自动从Kubernetes中发现到所有的node节点并作为当前Job监控的Target实例,发现的节点/metrics接口是默认的kubelet的HTTP接口

对于Ingress,Service,Endpoints, Pod的使用方式也是类似的,这里给出了一个完整Prometheus配置的示例:

apiVersion: v1data: prometheus.yml: |- global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'kubernetes-nodes' tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node - job_name: 'kubernetes-service' tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: service - job_name: 'kubernetes-endpoints' tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: endpoints - job_name: 'kubernetes-ingress' tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: ingress - job_name: 'kubernetes-pods' tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: pod kind: ConfigMapmetadata: name: prometheus-config

更新配置文件, 并重建Prometheus实例:

$ kubectl apply -f prometheus-config.ymlconfigmap "prometheus-config" configured
$ kubectl get podsprometheus-69f9ddb588-rbrs2 1/1 Running 0 4m
$ kubectl delete pods prometheus-69f9ddb588-rbrs2pod "prometheus-69f9ddb588-rbrs2" deleted
$ kubectl get podsprometheus-69f9ddb588-rbrs2 0/1 Terminating 0 4mprometheus-69f9ddb588-wtlsn 1/1 Running 0 14s

Prometheus使用新的配置文件重建之后,打开Prometheus UI,通过Service Discovery页面可以查看到当前Prometheus通过Kubernetes发现的所有资源对象。

同时Prometheus会自动将该资源的所有信息,并通过标签的形式体现在Target对象上。

@mtming333 甜橙金融翼支付 系统运维工程师: 

拉取全量标签,按需过滤、替换、丢弃后再利用


5、Pod内存使用率一直升高,请问有什么办法可以优化内存占用吗?

Pod内存使用率一直升高,我们怎样知道大概多久之后会到达Limit值,并在一定时刻触发告警,在Pod被杀掉之前进行排查?如果数据指标数量大导致Promethues占用内存很高,出现Prometheus容器OOM,请问有什么办法可以优化内存占用吗?

@晓风 光大科技 研发工程师:

1、Promtheus提供了基础的预测能力,基于当前的变化速度,推测一段时间后的值。Prometheus的Deriv和Predict_Linear函数可以满足这种需求。

predict_linear函数:对曲线变化速率进行计算,起到一定的预测作用。比如当前这1个小时的内存可用率急剧下降,这种情况可能导致内存已满,这时可以使用该函数,用当前1小时的数据去预测未来几个小时的状态,实现提前告警。

以mem_free为例,mem_free仅为举例,实际内存可用以mem_available为准。

执行查询:mem_free{instanceIP="xxx.xxxx.xxx.xxx"}/1024/1024

结果显示最近一小时的free值一直在下降。

deriv函数可以显示指标在一段时间的变化速度:

deriv(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h])

predict_linear函数是预测基于这种速度,最后可以达到的值:

predict_linear(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h], 2*3600)/1024/1024

你可以基于设置合理的告警规则,如小于10时触发告警:

rule: predict_linear(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h], 2*3600)/1024/1024 <10

predict_linear与deriv的关系: 含义上约等于如下表达式,不过predict_linear稍微准确一些。

deriv(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h]) * 2 * 3600+ mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h]

2、如果采集任务的数据指标数量非常巨大,就要考虑Prometheus的hash分区采集,分摊压力。还可以考虑省去一些在生产过程中没必要的指标。

@mtming333 甜橙金融翼支付 系统运维工程师:

这个要结合JMX exporter Prometheus让架构师看看

更多交流内容可点击阅读原文

觉得本文有用,请转发、点赞或点击“在看”,让更多同行看到


 资料/文章推荐:


欢迎关注社区 "监控"技术主题 ,将会不断更新优质资料、文章。地址:

https://www.talkwithtrend.com/Topic/3937


下载 twt 社区客户端 APP


长按识别二维码即可下载

或到应用商店搜索“twt”


长按二维码关注公众号

*本公众号所发布内容仅代表作者观点,不代表社区立场

继续滑动看下一个

基于 Prometheus 进行容器监控的5个常见难点解读

twt社区 twt企业IT社区
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存